// 核心js文件
import ElementMap from './element-map'
import { isFunction } from 'element-ui/src/utils/types'

const InputMap = ['el-input', 'el-input-number', 'ba-editor']

function getRule (item) {
  const { rule, isRequired, type, title } = item
  if (typeof isRequired === 'boolean' && isRequired) {
    // const isInput = type === 'el-input' || type === 'el-input-number' || type === 'ba-editor'
    const isInput = InputMap.indexOf(type) > -1
    return {
      required: true,
      message: `请${isInput ? '输入' : '选择'}${title}`,
      trigger: `${isInput ? 'blur' : 'change'}`
    }
  } else if (isRequired) {
    return rule
  } else {
    return null
  }
}

export function computeFormItem (config, form) {
  // console.log('config', config)
  // console.log('{ ...config }', { ...config })
  // console.log('form', form)
  // TODO: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性，拷贝到当前对象之中
  const item = { ...config }
  // console.log('item', item)
  // 计算组件真实对应的名称并传入一些默认值
  const res = ElementMap[item.type || 'input']
  // console.log('res', res)
  item.type = res.component
  // item.props = Object.assign(target: {}, res.props, item.props)
  // TODO: Object.assign方法用于对象的合并 将源对象 (source) 的所有可枚举属性 复制到目标对象 (target)
  // TODO: Object.assign方法的第一个参数是目标对象 后面的参数都是源对象
  item.props = Object.assign({}, res.props, item.props) // 如果目标对象与源对象有同名属性，或多个源对象有同名属性，则后面的属性会覆盖前面的属性

  // 处理联动
  if (isFunction(item.getProps)) {
    Object.assign(item.props, item.getProps(form))
  }
  item._isShow = isFunction(item.isShow) ? !!item.isShow(form) : true

  // 处理校验
  item._rule = getRule(item)

  // 设置内容宽度
  if (item.contentWidth) {
    const temp = typeof item.contentWidth === 'number' ? `${item.contentWidth}px` : item.contentWidth
    item.props.style = { width: temp }
  }
  // if (item.props.contentWidth) {
  //   item.props.style = { width: item.props.contentWidth }
  // }

  // 防止表单提交时存在多余 key
  if (!item._isShow) {
    delete form[item.key]
  }

  // console.log('return item', item)
  return item
}
